2014年信息学奥赛NOIP提高组
初赛
更早
2023-08-30 18:44:40
97次
一、单选题
以下程序段实现了找第二小元素的算法。输入是n个不等的数构成的数组S,输出S中第二小的数SecondMin。在最坏情况下,该算法需要做( )次比较。
if (S[1] < S[2]) {
FirstMin = S[1];
SecondMin = S[2];
} else {
FirstMin = S[2];
SecondMin = S[1];
}
for (i = 3; i <= n; i++)
if (S[i] < SecondMin)
if (S[i] < FirstMin) {
SecondMin = FirstMin;
FirstMin = S[i];
} else {
SecondMin = S[i];
}
| A. 2n |
B. n-1 |
| C. 2n-3 |
D. 2n-2 |
【知识点】 信息学NOIP提高组
有以下结构体说明和变量定义,如图所示,指针p、q、r分别指向一个链表中的三个连续结点。
struct node {
int data;
node *next;
} *p, *q, *r;
现要将q和r所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误的是( )。
| A. q->next = r->next; p->next = r; r->next = q; |
B. p->next = r; q->next = r->next; r->next = q; |
| C. q->next = r->next; r->next = q; p->next = r; |
D. r->next = q; q->next = r->next; p->next = r; |
【知识点】 信息学NOIP提高组
二、多选题
三、填空题
#include <iostream>
#include <string>
using namespace std;
const int SIZE = 100;
int main() {
string dict[SIZE];
int rank[SIZE];
int ind[SIZE];
int i, j, n, tmp;
cin >> n;
for (i = 1; i <= n; i++) {
rank[i] = i;
ind[i] = i;
cin >> dict[i];
}
for (i = 1; i < n; i++)
for (j = 1; j <= n - i; j++)
if (dict[ind[j]] > dict[ind[j + 1]]){
tmp = ind[j];
ind[j] = ind[j + 1];
ind[j + 1] = tmp;
}
for (i = 1; i <= n; i++)
rank[ind[i]] = i;
for (i = 1; i <= n; i++)
cout << rank[i] << " ";
cout << endl;
return 0;
}输入:
7
aaa
aba
bbb
aaa
aaa
ccc
aa
输出:_________
【知识点】 信息学NOIP提高组
#include <iostream>
using namespace std;
int fun(int n, int minNum, int maxNum) {
int tot, i;
if (n == 0)
return 1;
tot = 0;
for (i = minNum; i <= maxNum; i++)
tot += fun(n - 1, i + 1, maxNum);
return tot;
}
int main() {
int n, m;
cin >> n >> m;
cout << fun(m, 1, n) << endl;
return 0;
}输入:6 3
输出:_________
【知识点】 信息学NOIP提高组
#include <iostream>
using namespace std;
const int SIZE = 100;
int alive[SIZE];
int n;
int next(int num) {
do {
num++;
if (num > n)
num = 1;
} while (alive[num] == 0);
return num;
}
int main() {
int m, i, j, num;
cin >> n >> m;
for (i = 1; i <= n; i++)
alive[i] = 1;
num = 1;
for (i = 1; i <= n; i++) {
for (j = 1; j < m; j++)
num = next(num);
cout << num << " ";
alive[num] = 0;
if (i < n)
num = next(num);
}
cout << endl;
return 0;
}输入:11 3
输出:_________
【知识点】 信息学NOIP提高组
四、简答题
(最大子矩阵和)给出 m 行 n 列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。
输入第一行包含两个整数 m 和 n,即矩阵的行数和列数。之后 m 行,每行 n 个整数,描述整个矩阵。程序最终输出最大的子矩阵和。(第一空 2 分,其余 3 分,共 14分)
#include <iostream>
using namespace std;
const int SIZE = 100;
int matrix[SIZE + 1][SIZE + 1];
int rowsum[SIZE + 1][SIZE + 1]; //rowsum[i][j]记录第 i 行前 j 个数的和
int m, n, i, j, first, last, area, ans;
int main() {
cin >> m >> n;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
cin >> matrix[i][j];
ans = matrix (1) ;
for (i = 1; i <= m; i++)
(2) ;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
rowsum[i][j] = (3) ;
for (first = 1; first <= n; first++)
for (last = first; last <= n; last++) {
(4) ;
for (i = 1; i <= m; i++) {
area += (5) ;
if (area > ans)
ans = area;
if (area < 0)
area = 0;
}
}
cout << ans << endl;
return 0;
}
【知识点】 信息学NOIP提高组
(双栈模拟数组)只使用两个栈结构stack1和stack2,模拟对数组的随机读取。作为栈结构,stack1和stack2只能访问栈顶(最后一个有效元素)。栈顶指针top1和top2均指向栈顶元素的下一个位置。
输入第一行包含两个整数,分别是数组长度n和访问次数m,中间用单个空格隔开。
第二行包含n个整数,依次给出数组各项(数组下标从0到n-1)。第三行包含m个整数,需要访问的数组下标。对于每次访问,输出对应的数组元素。(前两空每空2.5分,其余每空3分,共14分)
#include <iostream>
using namespace std;
const int SIZE = 100;
int stack1[SIZE], stack2[SIZE];
int top1, top2;
int n, m, i, j;
void clearStack() {
int i;
for (i = top1; i < SIZE; i++)
stack1[i] = 0;
for (i = top2; i < SIZE; i++)
stack2[i] = 0;
}
int main() {
cin >> n >> m;
for (i = 0; i < n; i++)
cin >> stack1[i];
top1 = (1) ;
top2 = (2) ;
for (j = 0; j < m; j++) {
cin >> i;
while (i < top1 - 1) {
top1--;
(3) ;
top2++;
}
while (i > top1 - 1) {
top2--;
(4) ;
top1++;
}
clearStack();
cout << stack1[ (5) ] << endl;
}
return 0;
}
【知识点】 信息学NOIP提高组

